﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos

Public Class SerieBL
    Public Function RegistrarSerie(ByVal TokenConexion As String, ByVal Serie As SerieBE, ByRef detResp As DetalleRespuesta) As Boolean
        Dim SerieDAL As SerieDAL = New SerieDAL("")
        Dim emprBL As EmpresasBL = New EmpresasBL()
        Dim strRfc As String = ""
        detResp.Mensajes = ""
        Try
            If Not (String.IsNullOrWhiteSpace(Serie.NombreReporte)) Then
                strRfc = emprBL.getRFCEmpresa(TokenConexion)
                If (String.IsNullOrWhiteSpace(strRfc)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la asignación de Reporte a la Serie." & vbCrLf &
                                             "No fue posible obtener información de la Empresa." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            End If

            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaRegistrar(Serie, strRfc, detResp.Mensajes)) Then
                SerieDAL = New SerieDAL(TokenConexion)
                If (SerieDAL.existeSerie(Serie.Serie)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             "Existe un registro con la descripción de la serie indicada." & vbCrLf & detResp.Mensajes)
                    Return False
                Else
                    If (SerieDAL.registraSerie(Serie)) Then
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "La Serie se registro con éxito.")
                        Return True
                    Else
                        detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                 "La Serie no pudo ser registrada en el sistema. Verifique que el Certificado esté registrado en el Sistema." & vbCrLf & detResp.Mensajes)
                        Return False
                    End If
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                     "La Serie no es valida para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.RegistrarSerie")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al registrar Serie: " & ex.Message)
            Return False
        Finally
            SerieDAL = Nothing
        End Try
    End Function

    Private Function EsValidoParaRegistrar(ByRef Serie As SerieBE, ByVal strRfc As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try

            If (Serie.Serie Is Nothing) Then
                mensaje &= "La descripcion de la serie es obligatoria, no puede ir el campo nulo." & vbCrLf
            Else
                Serie.Serie = Serie.Serie.Trim.ToUpper
                If (Serie.Serie <> "") Then
                    If (Not csValidaciones.esSerieValida(Serie.Serie)) Then
                        mensaje &= "La Serie debe contener de 1 a 25 caracteres alfabéticos sin incluir acentos." & vbCrLf
                    End If
                End If
            End If

            If (String.IsNullOrEmpty(Serie.FolioInicial)) Then
                mensaje &= "El Folio Inicial de la serie es obligatorio, no puede ir vacio." & vbCrLf
            Else
                If (Serie.FolioInicial <= 0) Then
                    mensaje &= "El Folio Inicial debe ser mayor a 0" & vbCrLf
                Else
                    'El valor del folio inicial es valido y debe setearse el valor para folio siguiente
                    Serie.FolioSiguiente = Serie.FolioInicial
                    Serie.Expedidos = 0
                End If
            End If

            If Not (String.IsNullOrEmpty(Serie.NombreReporte)) Then
                Serie.NombreReporte = Serie.NombreReporte.Trim
                If (Serie.NombreReporte.Length > 50) Then
                    Serie.NombreReporte = Serie.NombreReporte.Substring(0, 50)
                End If
            End If

            If (String.IsNullOrEmpty(Serie.NumSerieCertificado)) Then
                mensaje &= "El Número de Serie del Certificado de la serie es obligatorio, no puede ir vacio." & vbCrLf
            Else
                Serie.NumSerieCertificado = Serie.NumSerieCertificado.Trim()
                If (Not csValidaciones.esNumeroDeCertificadoValido(Serie.NumSerieCertificado)) Then
                    mensaje &= String.Format("El Número de Certificado <{0}> no es válido, debe constar de 20 dígitos.{1}", mensaje, vbCrLf)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Serie.NombreReporte)) Then
                Serie.NombreReporte = ""
            Else
                If Not (System.IO.File.Exists(System.IO.Path.Combine(My.Settings.PathFiles, "rptsGenericos\CFDI", Serie.NombreReporte & ".rpt")) Or _
                         System.IO.File.Exists(System.IO.Path.Combine(My.Settings.PathFiles, strRfc, "rptsPersonalizados\CFDI", Serie.NombreReporte & ".rpt"))) Then
                    mensaje &= "El Reporte especificado <" & Serie.NombreReporte & "> no existe, favor de verificar." & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function CambiaEstatus(ByVal tokenConexion As String, ByVal pSerie As String, ByVal setActivo As Boolean, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim serDAL As SerieDAL = New SerieDAL("")
        Try
            If (EsValidoParaGetSerie(pSerie, detResp.Mensajes)) Then
                serDAL = New SerieDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (serDAL.cambiaStatus(pSerie, setActivo)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Estatus de la Serie Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de estatus de la Serie." & vbCrLf &
                                             "Verifique que la Serie esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.CambiaEstatus")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar estatus de la Serie: " & ex.Message)
            Return False
        Finally
            serDAL = Nothing
        End Try
    End Function

    Public Function ConsumeFolioSig(ByVal TokenConexion As String, ByVal Serie As String, ByRef pFolio As Integer, ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        pFolio = 0
        Dim SerieDAL As SerieDAL = New SerieDAL("")
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaGetSerie(Serie, detResp.Mensajes)) Then
                SerieDAL = New SerieDAL(TokenConexion)
                pFolio = SerieDAL.obtenerFolioSiguiente(Serie)
                If (pFolio > 0) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             detResp.Mensajes & vbCrLf & "No se consumió folio siguiente en la serie.")
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para consumir folio siguiente: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.ConsumeFolioSig")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al consumir Folio Siguiente de la serie: " & ex.Message)
            Return False
        Finally
            SerieDAL = Nothing
        End Try
    End Function

    Public Function GetSerie(ByVal tokenConexion As String, ByVal Serie As String, ByRef detResp As DetalleRespuesta) As SerieBE
        detResp.Mensajes = ""
        Dim SerieDAL As SerieDAL = New SerieDAL("")
        Dim SerieBE As SerieBE
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetSerie(Serie, detResp.Mensajes)) Then
                SerieDAL = New SerieDAL(tokenConexion)
                SerieBE = SerieDAL.getSerie(Serie)
                If (SerieBE IsNot Nothing) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Se obtuvo la información de la serie con éxito.")
                    Return SerieBE
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se obtuvo la información de la serie" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                     "La Serie proporcionada no es válida: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.GetSerie")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener información de la serie: " & ex.Message)
            Return Nothing
        Finally
            SerieDAL = Nothing
            SerieBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetSerie(ByRef Serie As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (Serie Is Nothing) Then
                mensaje &= "La descripcion de la serie es obligatoria, no puede ir el campo nulo." & vbCrLf
            Else
                Serie = Serie.Trim.ToUpper
                If (Serie <> "") Then
                    If (Not csValidaciones.esSerieValida(Serie)) Then
                        mensaje &= "La Serie debe contener de 1 a 25 caracteres alfabéticos sin incluir acentos." & vbCrLf
                    End If
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.EsValidoParaGetSerie")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Private Function EsValidoParaGetSeriePorId(ByRef IdSerie As Integer, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(IdSerie)) Then
                mensaje &= "El campo ID de la Serie no puede ir  vacio." & vbCrLf
            Else
                If (IdSerie <= 0) Then
                    mensaje &= "El Id de la Serie debe ser mayor a 0." & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.EsValidoParaGetSeriePorId")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoSerie(ByVal tokenConexion As String, ByVal tipoEstatus As Enumeraciones.estatusParaBusquedas, ByRef detResp As DetalleRespuesta) As List(Of SerieBE)
        detResp.Mensajes = ""
        Dim SerieDAL As SerieDAL = New SerieDAL("")
        Dim listSerieBE As List(Of SerieBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            SerieDAL = New SerieDAL(tokenConexion)
            listSerieBE = SerieDAL.getListadoSerie(tipoEstatus)
            If (listSerieBE IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de series con éxito.")
                Return listSerieBE
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                                 "No se obtuvo el listado de las series." & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.GetListadoSerie")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener el listado de serie: " & ex.Message)
            Return Nothing
        Finally
            SerieDAL = Nothing
            listSerieBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaAsignarReporte(ByRef Serie As String, ByRef strReporte As String, ByVal strRfc As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (Serie Is Nothing) Then
                mensaje &= "La descripcion de la serie es obligatoria, no puede ir el campo nulo." & vbCrLf
            Else
                Serie = Serie.Trim.ToUpper
                If (Serie <> "") Then
                    If (Not csValidaciones.esSerieValida(Serie)) Then
                        mensaje &= "La Serie debe contener de 1 a 25 caracteres alfabéticos sin incluir acentos." & vbCrLf
                    End If
                End If
            End If

            If (String.IsNullOrWhiteSpace(strReporte)) Then
                strReporte = ""
            Else
                If Not (System.IO.File.Exists(System.IO.Path.Combine(My.Settings.PathFiles, "rptsGenericos\CFDI", strReporte & ".rpt")) Or _
                         System.IO.File.Exists(System.IO.Path.Combine(My.Settings.PathFiles, strRfc, "rptsPersonalizados\CFDI", strReporte & ".rpt"))) Then
                    mensaje &= "El Reporte especificado <" & strReporte & "> no existe, favor de verificar." & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.EsValidoParaGetSerie")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Function AsignaReporte(ByVal tokenConexion As String, ByVal Serie As String, ByVal strNombreReporte As String, ByVal detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim serDAL As SerieDAL = New SerieDAL("")
        Dim emprBL As EmpresasBL = New EmpresasBL()
        Dim strRfc As String = ""
        Try
            strRfc = emprBL.getRFCEmpresa(tokenConexion)

            If (String.IsNullOrWhiteSpace(strRfc)) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                         "No se pudo realizar la asignación de Reporte a la Serie." & vbCrLf &
                                         "No fue posible obtener información de la Empresa." & vbCrLf & detResp.Mensajes)
                Return False
            End If

            If (EsValidoParaAsignarReporte(Serie, strNombreReporte, strRfc, detResp.Mensajes)) Then
                serDAL = New SerieDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (serDAL.AsignaReporte(Serie, strNombreReporte)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Reporte de la Serie Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la asignación de Reporte a la Serie." & vbCrLf &
                                             "Verifique que la Serie esté registrada en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.AsignaReporte")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al asignar Reporte a la Serie: " & ex.Message)
            Return False
        Finally
            serDAL = Nothing
        End Try
    End Function

    Function CambiaCertificado(ByVal tokenConexion As String, ByVal Serie As String, ByVal numCertif As String, ByVal detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim serDAL As SerieDAL = New SerieDAL("")
        Try
            If (EsValidoParaCambiarCertificado(Serie, numCertif, detResp.Mensajes)) Then
                serDAL = New SerieDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
                If (serDAL.cambiaCertificado(Serie, numCertif)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Certificado de la Serie Actualizado.")
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                             "No se pudo realizar la actualización de Certificado asignado a la Serie." & vbCrLf &
                                             "Verifique que la Serie y el Certificado esten registrados en el sistema." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.CambiaCertificado")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar certificado de la Serie: " & ex.Message)
            Return False
        Finally
            serDAL = Nothing
        End Try
    End Function

    Private Function EsValidoParaCambiarCertificado(ByRef Serie As String, ByRef numCertif As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (Serie Is Nothing) Then
                mensaje &= "La descripcion de la serie es obligatoria, no puede ir el campo nulo." & vbCrLf
            Else
                Serie = Serie.Trim.ToUpper
                If (Serie <> "") Then
                    If (Not csValidaciones.esSerieValida(Serie)) Then
                        mensaje &= "La Serie debe contener de 1 a 25 caracteres alfabéticos sin incluir acentos." & vbCrLf
                    End If
                End If
            End If

            If (String.IsNullOrEmpty(numCertif)) Then
                mensaje &= "El Número de Serie del Certificado de la serie es obligatorio, no puede ir vacio." & vbCrLf
            Else
                numCertif = numCertif.Trim()
                If (Not csValidaciones.esNumeroDeCertificadoValido(numCertif)) Then
                    mensaje &= String.Format("El Número de Certificado <{0}> no es válido, debe constar de 20 dígitos.{1}", mensaje, vbCrLf)
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "SerieBL.EsValidoParaCambiarCertificado")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

End Class
